package spil;
import java.util.Scanner;
import static spil.Text.*;
public class Spil {

	private GameBoard gameBoard;
	private Spiller spiller1, spiller2;
	private DiceCup rafle;
	private boolean endGame;
	private iAdapter ui;

	// Konstruktør der opretter de objekter der er nødvendige for at køre et spil
	public Spil() {
		rafle = new DiceCup(); // Opretter raflebæger med to terninger
		spiller1 = new Spiller(); // Opretter Spiller 1
		spiller2 = new Spiller(); // Opretter Spiller 2
		gameBoard = new GameBoard();
		endGame = false; // true = while-loop afsluttes, der er fundet en vinder!
		ui = null; // Værdien af denne bestemmes når brugeren vælger hvilket interface der skal benyttes
		
		gameBoard.feltSetup(); // Opretter felterne
	}
	
	// Metode der kører et spil. Det forudsættes alle objekter er oprettet
	public void startSpil()
	{
		Scanner scan = new Scanner(System.in);

		// Valg af interface
		int valg;
		do{
			System.out.println(CHOOSEUI);
			valg = scan.nextInt();
		}
		while(valg < 1 || valg > 3);

		if (valg == 1) {
			// Skaber et Adapter objekt som vi kalder ui
			ui = new Adapter();
			gameBoard.guiSetup();
		} 
		else if (valg == 2){
			// Skaber et TUI objekt som vi kalder ui. Vi sender gameBoardobjektet med idet TUI har brug for at kunne tilgå  metoder i gameBoard
			ui = new TUI(gameBoard);
		}

		// Sætter spillernavnet op for begge spillere og tilføjer spilleren med balance.
		spiller1.setName(ui.getUserString(ENTERNAME)); // Indtast et navn på spiller1
		if (spiller1.getName()==null || spiller1.getName().isEmpty()) // Hvis intet indtastes...
		{
			spiller1.setName("spiller1"); // ... sættes spiller1's navn til "spiller1".
		}
		ui.addPlayer(spiller1.getName(), spiller1.getKonto().getBalance(),0,0,255); // Opretter en spiller (RBG = blå)
		ui.setCar(1, spiller1.getName());

		spiller2.setName(ui.getUserString(ENTERNAME)); // Indtast et navn på spiller2
		if (spiller2.getName()==null || spiller2.getName().isEmpty()) // Hvis intet indtastes...
		{
			spiller2.setName("spiller2"); //... sættes spiller2's navn til "spiller2".
		}
		ui.addPlayer(spiller2.getName(), spiller2.getKonto().getBalance(),255,0,0);
		ui.setCar(1, spiller2.getName());


		do{
			//spiller1's tur
			do{
				ui.showMessage(spiller1.getName() + TURNGUI); // Beder spilleren trykke OK/Enter for at slå med terningerne
				rafle.rollDice(); // Slår med terningerne
				ui.setDice(rafle.getDice()[0], rafle.getDice()[1]); // Viser terningeslaget på interface
				spiller1.getKonto().updBalance(gameBoard.getConsequence(rafle.sum())); // Opdaterer spillerens balance/point
				updUI(spiller1, ui); // ui opdateres (bil flyttes på GUI, balance opdateres/printes)
			}
			while(rafle.sum()==10); // Summen 10 giver ekstraslag

			//spiller2's tur
			do{
				ui.showMessage(spiller2.getName() + TURNGUI);
				rafle.rollDice();
				ui.setDice(rafle.getDice()[0], rafle.getDice()[1]);
				spiller2.getKonto().updBalance(gameBoard.getConsequence(rafle.sum()));
				updUI(spiller2, ui);
			}
			while(rafle.sum()==10);

			//Win conditions undersøges
			if(spiller1.getKonto().getBalance()<0 || spiller2.getKonto().getBalance()<0 || spiller1.getKonto().getBalance()>=3000 || spiller2.getKonto().getBalance()>=3000){
				if(spiller1.getKonto().getBalance()==spiller2.getKonto().getBalance()){
					ui.showMessage(DRAW);
				}
				else if(spiller1.getKonto().getBalance()>spiller2.getKonto().getBalance()){
					ui.showMessage(spiller1.getName()+" "+WINNER);
				}
				else if(spiller2.getKonto().getBalance()>spiller1.getKonto().getBalance()){
					ui.showMessage(spiller2.getName()+" "+WINNER);
				}
				endGame=true;
			}

		}
		while(endGame==false);
		scan.close(); //Scanner lukker
		ui.close(); //GUI lukker
	}
	
	//Interface opdatering
	private void updUI(Spiller spiller, iAdapter ui){
		ui.removeCar(1, spiller.getName()); // Fjerner bilen fra start-feltet
		ui.setCar(rafle.sum(), spiller.getName()); // Sætter bilen på det felt svarende til hvad spilleren har slået med terningerne
		ui.setBalance(spiller.getName(), spiller.getKonto().getBalance()); // Opdaterer spillerens balance/point på spillepladen
		ui.showMessage(gameBoard.getDescriptionText(rafle.sum())); // Viser beskrivelsen af feltet for spilleren
		ui.removeCar(rafle.sum(), spiller.getName()); // Fjerner bilen fra det felt spilleren er landet på
		ui.setCar(1, spiller.getName()); // Sætter bilen på startfeltet
	}

}
